大家好!鐵人賽邁入第八天。
在昨天,我們用一個簡易的計算機 server,成功地展示了 AI Agent 呼叫 MCP Server 的基本流程。今天,我們要將難度與實用性大幅提升,打造一個能串接外部真實 API 的「天氣查詢工具」。
這個專案將會比計算機複雜,因為我們需要處理:
最終,我們將會建立一個能透過聊天視窗查詢台灣各縣市天氣的 AI 應用!
為了讓我們的專案結構清晰、易於維護,我們將建立三個各自獨立又互相協作的工作流:
Weather (天氣邏輯核心): 這個工作流是我們的「工具」。它的職責很單純:接收一個城市名稱,去中央氣象署抓取資料,然後將複雜的資料整理成一段簡潔的摘要。MCPClient (MCP 伺服器): 這個工作流是我們的「專案經理」。它負責對外溝通,將「天氣邏輯核心」包裝成一個符合 MCP 規範的工具,供 AI Agent 發現和呼叫。MCP Demo (AI Agent 主流程): 這是我們的「HOST」。使用者在這裡下達指令,AI Agent 會在這裡進行思考和決策。這種「職責分離」的架構,是軟體工程中的一個非常好的實踐!

我們從最內層的工人——Weather 工作流開始。
Weather。When Executed by Another Workflow 節點。這表示它只能被其他 n8n 工作流觸發。Code 節點: 接收傳入的城市名稱(例如 {"city": "臺中市"}),並使用我們之前學到的 Python 程式碼,組裝出中央氣象署 OpenData 的 API URL。import urllib.parse
# 這個腳本會處理所有傳入的項目
# 並假設每個項目中都有一個名為 'city' 的欄位
for item in _input.all():
# 1. 從傳入的 JSON 中獲取城市名稱
# 使用 .get() 是更安全的方式,如果找不到 'city',就使用預設值 '台北市'
city_name = item.json.get('city', '臺北市')
# 2. 定義 API 的固定部分
base_url = "https://opendata.cwa.gov.tw/api/v1/rest/datastore/F-C0032-001"
auth_token = "CWA-A4AA97C5-E3C1-4BEB-B730-688876F81863"
# 3. 對中文城市名稱進行 URL 編碼
# 這一步會將 "台中市" 轉換成 "%E8%87%BA%E4%B8%AD%E5%B8%82"
encoded_location_name = urllib.parse.quote(city_name)
# 4. 使用 f-string 組裝出完整的 API 網址
full_api_url = f"{base_url}?Authorization={auth_token}&locationName={encoded_location_name}"
# 5. 將產生好的網址,新增到 JSON 的一個新欄位 'apiUrl' 中
item.json['apiUrl'] = full_api_url
# 將所有被修改過的項目回傳給下一個節點
return _input.all()
HTTP Request 節點: 使用 GET 方法,呼叫 Code 節點產生的 URL,獲取天氣預報的原始 JSON 資料。設定如片如下
Edit Fields (或 Set) 節點: 氣象署回傳的資料非常龐大。使用這個節點來提取我們真正需要的欄位,例如未來幾個時段的「最高溫度」、「最低溫度」、「降雨機率」和「天氣狀況」。
Basic LLM Chain 節點: 這是畫龍點睛的一步!我們不直接回傳枯燥的數據,而是將提取出來的關鍵數據,交給另一個 LLM (例如 Gemini),並下 prompt。
你是一位智慧天氣助理,請根據以下輸入的臺中市逐時氣溫與每三小時降雨機率資料,整理出未來三天的天氣預報摘要,請優先使用資料內最早的日期優先當作第一天,請用繁體中文說明,並依照以下格式輸出:
以下是氣象資料:
每小時氣溫:包含 DataTime 與 ElementValue(溫度值): {{ $json.MinT }}{{ $json.MaxT }}
每三小時降雨機率:包含 StartTime、EndTime 與 ProbabilityOfPrecipitation : {{ $json.Rain }}
體感舒適度:{{ $json.Comfortindex }}
綜合天氣評論:{{ $json.Description }}
---
日期:年-月-日
天氣狀況:(可根據溫度與降雨機率簡要判斷,如「晴朗」、「局部短暫雨」、「午後雷陣雨」等)
最高溫度:°C
最低溫度:°C
降雨機率:%(取當天所有降雨機率中的最高值)
舒適程度:
請連續列出兩天資料,其餘皆不要輸出。並且使用繁體中文。
您的 Weather 工作流,完美地展示了從接收參數到最終用 LLM 美化輸出的完整過程。
接下來,我們建立「專案經理」——MCPClient 工作流,將剛剛的 Weather 工作流包裝成一個標準的 MCP 工具。
新建工作流,並命名為 MCPClient。
觸發器: 這次我們使用 MCP Server Trigger 節點。這個節點會生成一個專屬的 URL,讓外部的 MCP Host (如 Claude Desktop 或我們的 AI Agent) 可以連接。
新增工具 (Call n8n Workflow Tool):
MCP Server Trigger 下方,點擊 + 號,選擇 Add Tool,然後選擇 Call n8n Workflow Tool。Call this tool to get weather data (好的描述能幫助 AI Agent 更好地理解工具用途)city 的參數。Weather 工作流。
儲存並啟用 (Active) 工作流。
您的 MCPClient 工作流,清晰地展示了如何將一個內部工作流 (Call n8n Workflow Tool) 透過 MCP Server Trigger 暴露成一個外部可用的工具。
萬事俱備,只欠東風!現在回到我們的「HOST」——MCP Demo 工作流。
MCP Demo 工作流。AI Agent 節點。Tools 欄位,除了原有的計算機工具外,點擊 Add Tool,你會看到一個新的選項,來自我們的 MCP Server Trigger,選擇它,並將 get_weather_forecast_for_taiwan_city 工具掛載上去。打開 MCP Demo 工作流的聊天視窗,輸入你的指令:
給我臺中市天氣
你會看到 AI Agent 接收到指令後,經過短暫的思考,成功地呼叫了我們的天氣工具,並回傳了由 LLM 整理過的、非常人性化的天氣預報!
從日誌中可以看到,AI Agent (第一個 LLM) 決定使用工具,MCP Client 成功執行並回傳結果,最終由第二個 LLM 整合輸出。


恭喜你!今天我們完成了一個非常貼近真實應用場景的專案。我們學會了:
我們的 AI Agent 不再只是一個玩具,它已經具備了連接真實世界、獲取即時資訊的強大能力。明天,我們將繼續挑戰,打造下一個更酷的工具!